package cn.hh.ymcc.service.impl;

import cn.hh.ymcc.doc.CourseDoc;
import cn.hh.ymcc.dto.CourseSearchDto;
import cn.hh.ymcc.repository.CourseEsRepository;
import cn.hh.ymcc.result.PageList;
import cn.hh.ymcc.service.ICourseEsService;
import com.sun.org.apache.bcel.internal.generic.Select;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
public class CourseEsServiceImpl implements ICourseEsService {

    @Autowired
    private CourseEsRepository courseEsRepository;

    /**
     *  保存课程到Es
     * @param doc
     */
    @Override
    public void saveCourse(CourseDoc doc) {
        courseEsRepository.save(doc);
    }

    /**
     * 下架课程Es
     * @param courseId
     */
    @Override
    public void deleteByIdCourse(Long courseId) {
        courseEsRepository.deleteById(courseId);
    }

    /**
     *  根据条件从Es中搜索课程
     * @param dto
     * @return
     */
    @Override
    public PageList<CourseDoc> searchCourse(CourseSearchDto dto) {
        // 1.new一个NativeSearchQuery构建器
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder(); // 所有参数都可以在构建器上面设置
        // ===================== 包装查询参数=========================
        // 1.1.设置分页参数, 通过工具类PageRequest调用of()方法,传入dto页数,行数
        builder.withPageable(PageRequest.of(dto.getPage()-1,dto.getRows())); // 分页页码从0开始

        // 1.2.设置排序参数
        if (StringUtils.hasLength(dto.getSortField())){ // 调用工具类判断SortField排序字段是否为空
            String sortField = null; // 声明一个变量,用于设置获取到条件传入对应参数
            switch (dto.getSortField().toLowerCase()){ // 将获取到的SortField排序字段转为小写
                case "xl": sortField = "saleCount"; break;
                case "xp": sortField = "onlineTime"; break;
                case "pl": sortField = "commentCount"; break;
                case "jg": sortField = "price"; break;
                case "rq": sortField = "viewCount"; break;
            }
            if (StringUtils.hasLength(sortField)){ // 判断变量sortField是否为空
                SortOrder order = SortOrder.DESC; // 设置一个默认排序规则 (升序)
                //   判断getSortType排序规则是否为空且和默认排序规则是否相同,  不为空且排序规则相同就设置排序规则值
                if (StringUtils.hasLength(dto.getSortType()) && dto.getSortType().equalsIgnoreCase(SortOrder.ASC.toString())){
                    order =  SortOrder.ASC; // 不为空且和默认排序规则相同,设置为降序
                }
                // 通过工具类SortBuilders调用fieldSort方法,传入变量sortField排序参数和排序规则
                builder.withSort(SortBuilders.fieldSort(sortField).order(order));
            }
        }

        // 1.3.设置查询条件
        // 通过工具类创建一个查询条件对象
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //******* must: 模糊搜索
        if (StringUtils.hasLength(dto.getKeyword())){ // 判断getKeyword是否为空
            boolQuery.must(QueryBuilders.matchQuery("name",dto.getKeyword())); // 搜索课程名称
        }

        //****** filter: 等值搜索
        if (dto.getCourseTypeId() != null){
            boolQuery.filter(QueryBuilders.termQuery("courseTypeId",dto.getCourseTypeId()));
        }
        if (StringUtils.hasLength(dto.getGradeName())){
            boolQuery.filter(QueryBuilders.termQuery("gradeName",dto.getGradeName()));
        }
        if (StringUtils.hasLength(dto.getChargeName())){
            boolQuery.filter(QueryBuilders.termQuery("courseTypeId",dto.getCourseTypeId()));
        }
        if (dto.getChargeName() != null){
            boolQuery.filter(QueryBuilders.termQuery("ChargeName",dto.getChargeName()));
        }
        if (dto.getPriceMin() != null){
            boolQuery.filter(QueryBuilders.rangeQuery("price").gte(dto.getPriceMin()));
        }
        if (dto.getPriceMax() != null){
            boolQuery.filter(QueryBuilders.rangeQuery("price").lte(dto.getPriceMax()));
        }

        // 设置查询条件给builder
        builder.withQuery(boolQuery);

        // 2.通过构建器builder调用build方法,帮我们创建查询对象
        SearchQuery searchQuery =  builder.build();
        // 3.根据查询条件对象,执行查询
        Page<CourseDoc> search = courseEsRepository.search(searchQuery);
        // 将查询结果封装成PageList返回
        return new PageList<>(search.getTotalElements(),search.getContent()); // 获取到总条数,  获取到当前页
    }




}
